#include "include.h"

void usart3_send_str(uint8_t *str)
{
	uint16_t i=0;		

	do
	{
		USART_SendData(USART3,str[i++]);
		while(!USART_GetFlagStatus(USART3,USART_FLAG_TXE));
	}while(str[i]!=0);	
}

//void BlueTooth_USART3_Init(u32 baud)
//{
//	//GPIO端口设置
//	GPIO_InitTypeDef GPIO_InitStructure;
//	USART_InitTypeDef USART_InitStructure;
//	NVIC_InitTypeDef NVIC_InitStructure;
//	
//	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE); //使能GPIOB时钟
//	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);//使能USART3时钟
// 
//	//串口3对应引脚复用映射
//	GPIO_PinAFConfig(GPIOB,GPIO_PinSource10,GPIO_AF_USART3); //GPIOB10复用为USART3
//	GPIO_PinAFConfig(GPIOB,GPIO_PinSource11,GPIO_AF_USART3); //GPIOB11复用为USART3
//	
//	//USART1端口配置
//	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //GPIOB10与GPIOB11
//	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
//	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;	//速度50MHz
//	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
//	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
//	GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PA9，PA10

//   //USART3 初始化设置
//	USART_InitStructure.USART_BaudRate = baud;//波特率设置
//	USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
//	USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
//	USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
//	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
//	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;	//收发模式
//	USART_Init(USART3, &USART_InitStructure); //初始化串口3
//	
//	USART_Cmd(USART3, ENABLE);  //使能串口3 
//	
//	//USART_ClearFlag(USART1, USART_FLAG_TC);

//	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启相关中断

//	//Usart3 NVIC 配置
//	NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;//串口3中断通道
//	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY;//抢占优先级3
//	NVIC_InitStructure.NVIC_IRQChannelSubPriority =0;		//子优先级3
//	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;			//IRQ通道使能
//	NVIC_Init(&NVIC_InitStructure);	//根据指定的参数初始化VIC寄存器、

//	printf("bluetooth_config ok\r\n");

//}

////串口3中断服务程序
//void USART3_IRQHandler(void)                	
//{
//	static  uint8_t    rxbuf[40]={0};
//	static  uint32_t   i = 0;
//	uint8_t  d;
//	uint32_t  ulReturn;
//	BaseType_t xReturn;
//	/* 进入临界段，临界段可以嵌套 */
//	//ulReturn = taskENTER_CRITICAL_FROM_ISR();	
//	
//	if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)  
//	{
//		//接收串口数据
//		d=USART_ReceiveData(USART3);

//		rxbuf[i++]=d;
//		printf("i:%d \r\n",i);
//		//xSemaphoreTakeFromISR(g_mutex_printf,NULL); // 获取互斥信号量 
//		//USART_SendData(USART1,d);	
//		//xSemaphoreGiveFromISR(g_mutex_printf,NULL);		  // 释放互斥信号量 

//		//检测到'#'符或接收的数据满的时候则发送数据
//		if(d=='#' || i>=(sizeof rxbuf))
//		{
////			xReturn=xQueueSendFromISR(g_queue_bluetooth,(void *)rxbuf,NULL);
////			if (xReturn != pdTRUE)
////			{
////				printf("Failed to send data to the queue.\r\n");
////			}
////			else
////			{
////				printf("Data sent to the queue successfully.\r\n");
////			}
//			printf("hello world rxbuf:%s\r\n",rxbuf);
//			i=0;
//		}			
//		
//		//清空串口3接收中断标志位
//		USART_ClearITPendingBit(USART3, USART_IT_RXNE);
//	} 
//	//memset(rxbuf,0,sizeof rxbuf);
//	/* 退出临界段 */
//	//taskEXIT_CRITICAL_FROM_ISR( ulReturn );	
//} 
u8 rx_flag = 0; //数据接收标志位   1代表接收到数据了 
u8 rx_buf[100] = {0}; //接收的数据存储在这里
u8 rx_count=0;
void BlueTooth_USART3_Init(u32 baud)
{
	GPIO_InitTypeDef  GPIO_InitStruct;
	USART_InitTypeDef USART_InitStruct;
	NVIC_InitTypeDef  NVIC_InitStruct;
	
	
	//3. 串口时钟使能，GPIO 时钟使能
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB,ENABLE);    
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);
	
	//4.GPIO 初始化设置：要设置模式为复用功能
	GPIO_InitStruct.GPIO_Pin = GPIO_Pin_10 | GPIO_Pin_11; //引脚
	GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF ;//模式
	GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP ;//上拉
	GPIO_InitStruct.GPIO_Speed = GPIO_Speed_25MHz;//速度
	GPIO_Init(GPIOB, &GPIO_InitStruct);

	//5.设置引脚复用器映射：调用 GPIO_PinAFConfig 函数
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource10,GPIO_AF_USART3);
	GPIO_PinAFConfig(GPIOB, GPIO_PinSource11,GPIO_AF_USART3);
	
	//6.串口参数初始化：设置波特率，字长，奇偶校验等参数
	USART_InitStruct.USART_BaudRate = baud; //波特率
	USART_InitStruct.USART_WordLength = USART_WordLength_8b;//字长 8位数据位
	USART_InitStruct.USART_StopBits = USART_StopBits_1;//1位停止位
	USART_InitStruct.USART_Parity = USART_Parity_No;//无校验
	USART_InitStruct.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//可以发射和接收
	USART_InitStruct.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件控制流
	USART_Init(USART3, &USART_InitStruct);
	
	//7.开启中断并且初始化 NVIC，使能中断（如果需要开启串口中断才需要这个步骤）
	NVIC_InitStruct.NVIC_IRQChannel = USART3_IRQn;  //中断通道
	NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;//使能
	NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0x05;//抢占优先级 2bit
	NVIC_InitStruct.NVIC_IRQChannelSubPriority = 0x00;//响应优先级 2bit
	NVIC_Init(&NVIC_InitStruct);
	
	//8.配置为接收中断（表示有数据过来，CPU要中断进行接收）
	USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);    
	
	//9.使能串口
	USART_Cmd(USART3, ENABLE);
}
//10.编写中断处理函数：函数名格式为 USARTx_IRQHandler(x 对应串口号)。
void USART3_IRQHandler(void)
{
	/* 进入临界段，临界段可以嵌套 */
	uint32_t ulReturn = taskENTER_CRITICAL_FROM_ISR();
	
	//判断接收标志位是否置1
    if(USART_GetITStatus(USART3, USART_IT_RXNE) == SET)
    {
        //清除接收标志位
        USART_ClearITPendingBit(USART3, USART_IT_RXNE);  
	
		//接收数据
		rx_buf[rx_count++] = USART_ReceiveData(USART3);
		
		//回射数据
		USART_SendData(USART3, rx_buf[rx_count-1]);
		
		//判断是否接收到一帧数据
		if((rx_buf[rx_count-1] =='#') || (rx_count >=(sizeof rx_buf)))
		{
			rx_flag = 1;
			rx_count = 0;
		}
    }
		/* 退出临界段 */
	taskEXIT_CRITICAL_FROM_ISR( ulReturn );	
	
//	printf("rx_count:%d \r\n",rx_count);
//	printf("rx_buf:%c\r\n",rx_buf[rx_count-1]);
}
